package org.example.controller;

import com.github.pagehelper.PageInfo;
import org.example.entity.Files;
import org.example.entity.Folder;
import org.example.entity.Note;
import org.example.service.FilesService;
import org.example.service.FolderService;
import org.example.service.NoteService;
import org.example.utils.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@CrossOrigin(origins = "*")
@RequestMapping("/files")
public class FilesController {

    @Resource
    private FilesService filesService;

    @Resource
    private NoteService noteService;

    @Resource
    private FolderService folderService;

    @PostMapping("/save")
    public Map<String,Object> save(@RequestBody Files files) {
        if(files.getName() == null || files.getName().equals("")){
            return Result.fileMap("文件名不能为空");
        }
        return Result.successMap("文件保存成功");
    }

    /**
     *desc 请求地址：http://localhost:8090/files/newFile
     *
     * */
    @PostMapping("/newFile")
    public Map<String,Object> newFile(@RequestBody Map<String,Object> file) {
        // 从请求体中获取文件名
        String fileName = (String) file.get("fileName");
        // 检查文件名是否为空
        if(fileName == null || "".equals(fileName)){
            return Result.fileMap("文件名不能为空");
        }
        // 从请求体中获取文件类型
        String fileType = (String) file.get("fileType");
        // 检查文件类型是否为空
        if(fileType == null){
            return Result.fileMap("文件类型不能为空");
        }
        // 从请求体中获取用户ID
        Long userId = Long.valueOf(file.get("userId").toString());
        // 获取当前时间作为更新时间
        Date updatedTime = new Date();
        // 调用fileNameExistsReset方法来重置文件名，以防止文件名重复
        fileName = filesService.fileNameExistsReset(file);
        // 将重置后的文件名放回到文件信息中
        file.put("fileName", fileName);
        boolean successfullySaved;
        // 根据文件类型创建相应的对象，并设置其属性，然后保存到数据库中
        switch (fileType) {
            case "folder":
                Folder folder = new Folder();
                folder.setFolderName(fileName);
                folder.setUserId(userId);
                folder.setUpdatedTime(updatedTime);
                successfullySaved = folderService.save(folder);
                break;
            case "note":
                Note note = new Note();
                note.setTitle(fileName);
                note.setUserId(userId);
                note.setUpdatedTime(updatedTime);
                successfullySaved = noteService.save(note);
                break;
            case "file":
                Files files = new Files();
                files.setName(fileName);
                files.setUserId(userId);
                files.setUpdatedTime(updatedTime);
                successfullySaved = filesService.save(files);
                break;
            default:
                return Result.fileMap("文件类型错误");
        }
        // 检查保存操作是否成功
        if(!successfullySaved){
            return Result.fileMap("文件保存失败");
        }
        // 返回成功的消息和文件信息
        return Result.successMap(file);
    }

    @DeleteMapping("/remove/{id}")
    public Map<String,Object> remove(@PathVariable Serializable id) {
        Files files = filesService.getById(id);
        if (files == null){
            return Result.fileMap("文件不存在");
        }
        return Result.successMap("文件删除成功");
    }

    @PutMapping("/update")
    public Map<String,Object> update(@RequestBody Files files) {
        if(files.getFileId() == null){
            return Result.fileMap("文件ID不能为空");
        }
        if(StringUtils.isEmpty(files.getName())){
            return Result.fileMap("文件名不能为空");
        }
        boolean b = filesService.updateById(files);
        if(!b){
            return Result.successMap("文件更新失败");
        }
        return Result.successMap();
    }

    @GetMapping("/list")
    public Map<String,Object> list() {
        Map<String,Object> map = new HashMap<>();
        map.put("filesList",new PageInfo<>(filesService.list()));
        return Result.successMap(map);
    }

    @GetMapping("/getInfo/{id}")
    public Map<String,Object> getInfo(@PathVariable Serializable id) {
        return Result.successMap(filesService.getById(id));
    }
}